package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1、整合mybatis-plus
 *  1)、导入依赖
 *  2)、配置
 *      ①、配置数据源
 *          1)、导入数据库的驱动
 *          2)、在application。yml配置数据源相关信息
 *      ②、配置mybatis-plus
 *          1)、使用@MapperScan
 *          2)、告诉mybatis-plus，sql映射文件位置
 *  2、逻辑删除
 *      1)、配置全局的逻辑删除规则（3.1.0版本后可省略）
 *      2)、配置逻辑删除的组件（3.1.0版本后可省略）
 *      3)、给Bean加上逻辑删除注解@TableLogic
 *  3、JSR303校验
 *      1)、给Bean添加校验注解:javax.validation.constraints.*，并定义自己的message提示
 *      2)、开启校验功能，@Valid
 *          效果：校验错误之后会有默认的响应
 *      3)、给校验的bean后紧跟一个BindingResult，就可以获取到校验结果
 *      4)、分组校验（多场景的复杂校验）
 *          ①@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class, UpdateGroup.class})
 *              给校验注解标注什么情况需要进行校验
 *          ②@Validated({AddGroup.class})
 *          ③默认没有指定分组的校验注解@NotBlank，在分组校验情况@Validated(UpdateGroup.class)下不生效，只会在groups = {AddGroup.class, UpdateGroup.class}生效
 *  4、统一的异常处理
 *     @ControllerAdvice
 *      1)、编写异常处理类，使用@ControllerAdvice
 *      2)、使用@ExceptionHandler进行异常处理，返回响应数据
 *  5、自定义校验
 *      1)、编写一个自定义的校验注解
 *      2)、编写一个自定义的校验器 ConstraintValidator
 *      3)、关联自定义的校验器和自定义的校验注解
 *      @Documented
 *      @Constraint(validatedBy = { ListValueConstraintValidator.class })  可以指定多个不同的校验器
 *      @Target({
 *         ElementType.METHOD,
 *         ElementType.FIELD,
 *         ElementType.ANNOTATION_TYPE,
 *         ElementType.CONSTRUCTOR,
 *         ElementType.PARAMETER,
 *         ElementType.TYPE_USE
 *      })
 *      @Retention(RetentionPolicy.RUNTIME)
 *      public @interface ListValue {
 *
 *   6、模板引擎
 *    1)、thymeleaf-starter：关闭缓存
 *    2)、静态资源都放在static文件夹下就可以按照路径直接访问
 *    3)、页面放在templates文件夹下，按照页面名直接访问
 *          spring boot，访问项目的时候，默认会找index
 *    4)、页面修改不重启服务器实时更新
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
